#ifndef SINTATICO_H_
#define SINTATICO_H_


#include <algorithm>
#include <cctype>
#include <iostream>
#include <iostream>
#include <string>
using namespace std;

#include "../etc/Error.h"

/*
 * Biblioteca do Sintatico
 */
#include "TabelaHash.h"
#include "Parametro.h"
#include "ProcedimentoFuncao.h"
#include "Variavel.h"
#include "Tree.h"
#include "GerenciarToken.h"

class Sintatico {
public:
	Sintatico();

	void setTokenizerList(list<Tokenizer>);
	
	/*
	 * Cartas Sintaticas
	 */
	bool CartaPrograma();
	bool CartaIdentificador();
	bool CartaBloco(noTree*);
	bool CartaTipo();
	bool CartaParametrosFormais(noTree*,ProcedimentoFuncao*);
	bool CartaComando(noTree*);
	bool CartaBlocoVariaveis(noTree*);
	bool CartaBlocoProcedure(noTree*,noTree*);
	bool CartaBlocoFunction(noTree*,noTree*);
	bool CartaBlocoBegin(noTree*);
	bool CartaComandoSemRotulo(noTree*);
	bool CartaComandoSemRotuloWrite(noTree*);
	bool CartaComandoSemRotuloRead(noTree*);
	bool CartaComandoSemRotuloIf(noTree*);
	bool CartaComandoSemRotuloWhile(noTree*);
	bool CartaComandoSemRotuloBegin(noTree*);
	bool CartaComandoSemRotuloIdentificador(noTree*);
	bool CartaNumero();
	bool CartaExpressao();
	bool CartaExpressaoSimples();
	bool CartaTermo();
	bool CartaFator();

	
	/*
	 * functions of Syntatic Analysis
	 */
	void nivelPlusPlus();
	void nivelMinusMinus();
	bool doSyntaticAnalysis(Tree*, TabelaHash*);
	TabelaHash *getHashTable();
	Tree* getSyntaticTree();
	string ToLowerCase(string);
	int lowerCase (int);
	int getNivelLexico();
	void callErro(int);
	void callErro(int,string);
	void callErro(int,string,string);
	virtual ~Sintatico();

private:
	
	Error erro;
	list<string>prototypeNameFunctionProcedure;
	list<string>*expressionList;
	GerenciarToken tokenizerList;
	TabelaHash *hashTable;
	Tree *syntaticTree;
	int nivelLexico;
	bool isExpress;

};

#endif /*SINTATICO_H_*/
